import request from '@/api/request'

/**
 * 文件 URL 生成相关接口
 * 支持 MinIO 预签名 URL 和本地存储
 */

/**
 * 批量 URL 请求
 */
export interface BatchUrlRequest {
  fileIds: number[]
  expirationSeconds?: number
}

/**
 * 生成文件下载 URL
 */
export const generateDownloadUrl = (fileId: number, expirationSeconds: number = 3600) => {
  return request.get<string>(`/files/urls/${fileId}/download`, {
    params: { expirationSeconds }
  })
}

/**
 * 生成文件预览 URL
 */
export const generatePreviewUrl = (fileId: number, expirationSeconds: number = 1800) => {
  return request.get<string>(`/files/urls/${fileId}/preview`, {
    params: { expirationSeconds }
  })
}

/**
 * 批量生成下载 URL
 */
export const batchGenerateDownloadUrls = (data: BatchUrlRequest) => {
  return request.post<Record<number, string>>('/files/urls/batch/download', data)
}

/**
 * 批量生成预览 URL
 */
export const batchGeneratePreviewUrls = (data: BatchUrlRequest) => {
  return request.post<Record<number, string>>('/files/urls/batch/preview', data)
}

/**
 * 刷新 URL（如果即将过期）
 */
export const refreshUrl = (fileId: number, urlType: 'download' | 'preview') => {
  return request.post<string>(`/files/urls/${fileId}/refresh`, null, {
    params: { urlType }
  })
}

/**
 * 智能文件下载
 * 自动选择最优的下载方式（直接下载或预签名URL）
 */
export const smartDownloadFile = async (fileId: number, fileName: string) => {
  try {
    // 首先尝试使用新的 URL 生成 API
    const response = await generateDownloadUrl(fileId)
    const downloadUrl = response.data

    // 如果返回的是完整的 URL（MinIO 预签名），直接跳转
    if (downloadUrl.startsWith('http')) {
      // 使用 window.open 而不是 a 标签，避免 CORS 问题
      window.open(downloadUrl, '_blank')
      return
    }

    // 否则回退到传统的 blob 下载方式
    throw new Error('需要使用传统下载方式')

  } catch (error) {
    console.warn('新 URL API 不可用，回退到传统下载方式:', error)

    try {
      // 回退到传统的文件下载方式，但要处理可能的重定向
      const response = await request.get(`/files/${fileId}/download`, {
        responseType: 'blob',
        maxRedirects: 0,  // 禁止自动重定向
        validateStatus: function (status) {
          return status >= 200 && status < 400; // 接受 2xx 和 3xx 状态码
        }
      })

      // 如果是重定向响应，获取重定向 URL
      if (response.status === 302 || response.status === 301) {
        const redirectUrl = response.headers.location
        if (redirectUrl) {
          window.open(redirectUrl, '_blank')
          return
        }
      }

      // 如果是正常的 blob 响应
      const blob = new Blob([response.data])
      const url = window.URL.createObjectURL(blob)

      const link = document.createElement('a')
      link.href = url
      link.download = fileName
      document.body.appendChild(link)
      link.click()

      document.body.removeChild(link)
      window.URL.revokeObjectURL(url)

    } catch (downloadError) {
      console.error('传统下载方式也失败:', downloadError)
      throw downloadError
    }
  }
}

/**
 * 智能文件预览
 * 自动选择最优的预览方式
 */
export const smartPreviewFile = async (fileId: number, mimeType: string) => {
  try {
    // 首先尝试使用新的 URL 生成 API
    const response = await generatePreviewUrl(fileId)
    const previewUrl = response.data
    
    // 如果返回的是完整的 URL（MinIO 预签名），直接返回
    if (previewUrl.startsWith('http')) {
      return previewUrl
    }
    
    // 否则回退到传统的预览方式
    throw new Error('需要使用传统预览方式')
    
  } catch (error) {
    console.warn('新 URL API 不可用，回退到传统预览方式:', error)
    
    // 根据文件类型构建传统预览 URL
    if (mimeType?.startsWith('image/')) {
      return `/api/preview/image/${fileId}`
    } else if (mimeType === 'application/pdf') {
      return `/api/preview/pdf/${fileId}`
    } else if (mimeType?.startsWith('video/')) {
      return `/api/preview/video/${fileId}`
    } else if (mimeType?.includes('document') || mimeType?.includes('word')) {
      return `/api/preview/document/${fileId}`
    } else if (mimeType?.includes('spreadsheet') || mimeType?.includes('excel')) {
      return `/api/preview/spreadsheet/${fileId}`
    } else {
      return `/api/files/${fileId}/preview`
    }
  }
}

/**
 * 检查存储类型
 * 用于前端判断使用哪种下载/预览策略
 */
export const getStorageType = async () => {
  try {
    const response = await request.get<{ storageType: string }>('/system/storage-type')
    return response.data.storageType
  } catch (error) {
    console.warn('无法获取存储类型，假设为本地存储')
    return 'local'
  }
}

/**
 * 批量智能下载
 * 优化多文件下载性能
 */
export const batchSmartDownload = async (files: Array<{ id: number, name: string }>) => {
  try {
    // 尝试批量生成下载 URL
    const fileIds = files.map(f => f.id)
    const response = await batchGenerateDownloadUrls({ fileIds })
    const urls = response.data
    
    // 批量下载
    files.forEach(file => {
      const url = urls[file.id]
      if (url && url.startsWith('http')) {
        const link = document.createElement('a')
        link.href = url
        link.download = file.name
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      }
    })
    
  } catch (error) {
    console.warn('批量下载失败，回退到单个下载:', error)
    
    // 回退到单个下载
    for (const file of files) {
      await smartDownloadFile(file.id, file.name)
      // 添加延迟避免浏览器限制
      await new Promise(resolve => setTimeout(resolve, 100))
    }
  }
}
